package cn.zc.curriculum.service.config.hander.feignHandler;


import cn.tools.core.base.R;
import cn.tools.core.exception.BizException;
import com.alibaba.fastjson.JSONObject;
import feign.Response;
import feign.codec.ErrorDecoder;

/**
 * feign接口调用报错处理类，服务端接口业务异常会调用BIZException类抛出业务异常信息，但feign无法捕获到这些返回信息
 * 进而触发FeignException,逐层往上抛，直到触发Exception,抛出自定义的异常信息，系统异常，但对于客户来讲，他并不知道
 * 发生了什么，如账户输入错误，但BIZ抛出的提示，账户错误，无法返回，反而返回一个系统异常，对客户非常不友好，所以要自定义
 * 一个处理feign的异常方法
 */

public class FeignErrorCode implements ErrorDecoder {

    /**
     * feign调用异常返回信息都会抛至ErrorDecoder中,我们选择重写他自带的decode方法，将返回的错误信息获取出来，再抛出到客户端
     * 注意这个方法只有在调用异常时才会触发，所以我们这里没有写判定返回code是否是200
     * @param s
     * @param response
     * @return
     */
    @Override
    public Exception decode(String s, Response response) {
        R r = JSONObject.parseObject(String.valueOf(response.body()), R.class);
        return new BizException(r.getMsg());
    }

}
